//#pragma once
//#include <PxConfig.h>
//#include <foundation/PxFoundation.h>
//#include <foundation/PxErrorCallback.h>
//#include <foundation/PxAllocatorCallback.h>
//#include <foundation/PxPhysicsVersion.h>
//
//namespace primal
//{
//	class physical_foundation :public physx::PxFoundation
//	{
//	public:
//		void release()override;
//		physx::PxErrorCallback& getErrorCallback()override;
//		void setErrorLevel(physx::PxErrorCode::Enum mask = physx::PxErrorCode::eMASK_ALL)override;
//		physx::PxErrorCode::Enum getErrorLevel() const override;
//		physx::PxAllocatorCallback& getAllocatorCallback()override;
//		bool getReportAllocationNames() const override;
//		void setReportAllocationNames(bool value)override;
//		void registerAllocationListener(physx::PxAllocationListener& listener)override;
//		void deregisterAllocationListener(physx::PxAllocationListener& listener)override;
//		void registerErrorCallback(physx::PxErrorCallback& callback)override;
//		void deregisterErrorCallback(physx::PxErrorCallback& callback)override;
//		bool error(physx::PxErrorCode::Enum c, const char* file, int line, const char* messageFmt, ...)override;
//		bool error(physx::PxErrorCode::Enum, const char* file, int line, const char* messageFmt, va_list)override;
//		
//	private:
//		class error_callback : public physx::PxErrorCallback
//		{
//		public:
//			void reportError(physx::PxErrorCode::Enum code, const char* message, const char* file, int line);
//		}error_cbk;
//
//		class allocation_callback : public physx::PxAllocatorCallback
//		{
//		public:
//			void* allocate(size_t size, const char* typeName, const char* filename, int line) override;
//			void deallocate(void* ptr)override;
//		}alloctor_cbk;
//	};
//
//	class error_callback : public physx::PxErrorCallback
//	{
//	public:
//		void reportError(physx::PxErrorCode::Enum code, const char* message, const char* file, int line);
//	};
//
//	class allocation_callback : public physx::PxAllocatorCallback
//	{
//	public:
//		void* allocate(size_t size, const char* typeName, const char* filename, int line) override;
//		void deallocate(void* ptr)override;
//	};
//
//	template<typename T>
//	class PhyPtr
//	{
//		PX_NOCOPY(PhyPtr)
//	public:
//		PhyPtr() : ptr{}
//		{}
//		PhyPtr(T* p) :ptr{ p }
//		{}
//		~PhyPtr()
//		{
//			internal_release();
//		}
//
//		void reset()
//		{
//			internal_release();
//			ptr = nullptr;
//		}
//
//		PhyPtr& operator=(T* p)
//		{
//			this->ptr = p;
//		}
//
//		T* operator->()
//		{
//			return ptr;
//		}
//
//		T& get()
//		{
//			return *ptr;
//		}
//
//		operator T& ()
//		{
//			return *ptr;
//		}
//	protected:
//		T* ptr;
//	private:
//		void internal_release()
//		{
//			if(ptr != nullptr)
//			{
//				ptr->release();
//			}
//		}
//	};
//}